package com.ygqh.baby.service;

import com.ygqh.baby.ao.Message;
import com.ygqh.baby.ao.ProductStatus;
import com.ygqh.baby.ao.QueryInfo;
import com.ygqh.baby.ao.ResultSet;
import com.ygqh.baby.model.*;
import com.ygqh.baby.po.YgSku;
import com.ygqh.baby.po.YgStock;

import java.util.Date;
import java.util.List;

public interface YgStockService {

    List<YgStock> find();

    int findCount();

    YgStock findById(Long id);

    int deleteSoft(Long[] ids);

    int deleteSoft(Long id);

    int save(YgStock ygStock);

    int update(YgStock ygStock);

    int saveOrUpdate(YgStock ygStock);

    ResultSet<YgStock> search(QueryInfo queryInfo, String q, Long groupId, String productName, String productCode, String skuCode, Long amount, Boolean isPre);

    YgStock findBySkuCode(String skuCode);

    List<YgStock> findBySkuCodes(String[] array);

    /**
     * 扣减库存
     *
     * @param stocks
     * @return
     */
    int reduceStock(List<YgStock> stocks, String from);

    /**
     * 校验库存
     *
     * @param skuId
     * @param quantity
     * @return
     */
    Boolean validateStockNum(Long skuId, Long quantity);

    /**
     * 还库存
     *
     * @param stockList
     * @param from
     * @return
     */
    int backStock(List<YgStock> stockList, String from);

    /**
     * 批量更新库存
     *
     * @param stockList
     * @param updateBy
     * @param remark
     * @return
     */
    int updateBatch(List<YgStock> stockList, String updateBy, String remark);

    int updateBatchByTask(List<YgStock> stockList);

    List<CheckStockModel> checkStock();

    List<YgSku> findByProductId(Long productId);

    /**
     * @param updateBy （可空） 入参
     * @return YgStock 返回类型
     * @throws @date 2017年8月14日 下午5:55:30
     * @Title: findLastUpdate
     * @author （guohao）
     * @version V1.0
     */
    YgStock findLastUpdate(String updateBy);

    Message validateStockNum(List<YgShoppingCarModel> carList);

    List<StockModel> findProductStock(Date startDate, Date endDate, Long amount);

    List<StockModel> findSkuStockByProduct(List<String> list);

    ResultSet<StockModel> searchV2(QueryInfo queryInfo, String q, ProductStatus productStatus, String productName, String productCode, String skuCode,
                                   Long amount, Long supplierId, Boolean isPre, Boolean isSync, String adminProductName, String barCode);

    int setSync(String skuCode, Boolean sync);

    List<YgStockModel> findByProductCode(String productCode);

    List<YgStockModel> findByProductCodes(List<String> productCodes);

    /**
     * 获取旺店通真实库存
     * @param skuCode
     * @return
     */
    List<StockVo> findStockVoBySkuCodes(String... skuCode);

    /**
     * 获取旺店通真实库存
     * @param productCodes
     * @return
     */
    List<StockVo> findStockVoByProductCodes(String... productCodes);


    List<StockModel> getStockList(QueryInfo queryInfo, String q,
                                  ProductStatus productStatus, String productName,
                                  String productCode, String skuCode, Long amount, Long supplierId,
                                  Boolean isPre, Boolean isSync, String adminProductName,
                                  String barCode);

    Message fullySyncStockFromWdt();

    Message syncStockFromWdt(String... skuCode);

    List<String> getSkuCodeListForSyncStock();

    Message doSyncStockSplit(List<String> skuCodeList, String updateFrom);
}
